iconhelper: Require a widget as construction argument
authorBenjamin Otte <otte@redhat.com>
Tue, 8 Dec 2015 14:39:10 +0000 (15:39 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 9 Dec 2015 12:30:40 +0000 (13:30 +0100)
Note that the caller needs to ensure the widget lives as long as the
iconhelper as the iconhelper will not ref the widget.

gtk/deprecated/gtkstatusicon.c
gtk/gtkcellrendererpixbuf.c
gtk/gtkentry.c
gtk/gtkiconhelper.c
gtk/gtkiconhelperprivate.h
gtk/gtkimage.c
gtk/gtkspinbutton.c

index d6e13f73b95383c04cdeeffef2307e232e09e552..fd65b0aa5439b06747cbfe510182e54657e6fb9e 100644 (file)
@@ -1394,7 +1394,7 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
   context = gtk_widget_get_style_context (widget);
   round_size = round_pixel_size (widget, priv->size);
 
-  icon_helper = _gtk_icon_helper_new ();
+  icon_helper = _gtk_icon_helper_new (widget);
   _gtk_icon_helper_set_force_scale_pixbuf (icon_helper, TRUE);
   _gtk_icon_helper_set_definition (icon_helper, priv->image_def);
   _gtk_icon_helper_set_icon_size (icon_helper, GTK_ICON_SIZE_SMALL_TOOLBAR);
index 09597ce20461c7ad47aa0e60eb3811850d5aed6b..397e7daea0d626b229f074fccd3ca53ba68f9eaf 100644 (file)
@@ -440,12 +440,13 @@ gtk_cell_renderer_pixbuf_new (void)
 }
 
 static GtkIconHelper *
-create_icon_helper (GtkCellRendererPixbuf *cellpixbuf)
+create_icon_helper (GtkCellRendererPixbuf *cellpixbuf,
+                    GtkWidget             *widget)
 {
   GtkCellRendererPixbufPrivate *priv = cellpixbuf->priv;
   GtkIconHelper *helper;
 
-  helper = _gtk_icon_helper_new ();
+  helper = _gtk_icon_helper_new (widget);
   _gtk_icon_helper_set_force_scale_pixbuf (helper, TRUE);
   _gtk_icon_helper_set_definition (helper, priv->image_def);
   _gtk_icon_helper_set_icon_size (helper, priv->icon_size);
@@ -475,7 +476,7 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer    *cell,
   context = gtk_widget_get_style_context (widget);
   gtk_style_context_save (context);
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_IMAGE);
-  icon_helper = create_icon_helper (cellpixbuf);
+  icon_helper = create_icon_helper (cellpixbuf, widget);
 
   if (!_gtk_icon_helper_get_is_empty (icon_helper))
     _gtk_icon_helper_get_size (icon_helper, 
@@ -579,18 +580,18 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer      *cell,
 
       if (is_expanded && priv->pixbuf_expander_open != NULL)
         {
-          icon_helper = _gtk_icon_helper_new ();
+          icon_helper = _gtk_icon_helper_new (widget);
           _gtk_icon_helper_set_pixbuf (icon_helper, priv->pixbuf_expander_open);
         }
       else if (!is_expanded && priv->pixbuf_expander_closed != NULL)
         {
-          icon_helper = _gtk_icon_helper_new ();
+          icon_helper = _gtk_icon_helper_new (widget);
           _gtk_icon_helper_set_pixbuf (icon_helper, priv->pixbuf_expander_closed);
         }
     }
 
   if (icon_helper == NULL)
-    icon_helper = create_icon_helper (cellpixbuf);
+    icon_helper = create_icon_helper (cellpixbuf, widget);
 
   _gtk_icon_helper_set_window (icon_helper,
                               gtk_widget_get_window (widget));
index 3a849c3f2cb541e44c2c088910c140ae526df788..139bd11014d52486bf24a9531c1d5450f4870021 100644 (file)
@@ -3260,7 +3260,7 @@ construct_icon_info (GtkWidget            *widget,
   icon_info = g_slice_new0 (EntryIconInfo);
   priv->icons[icon_pos] = icon_info;
 
-  icon_info->icon_helper = _gtk_icon_helper_new ();
+  icon_info->icon_helper = _gtk_icon_helper_new (widget);
   _gtk_icon_helper_set_force_scale_pixbuf (icon_info->icon_helper, TRUE);
 
   widget_node = get_entry_node (widget);
index 8961713136fbd9e55a6873152bfed5ef8772a378..9cae307173b6464c06d7285786545885b3bc2724 100644 (file)
@@ -34,6 +34,7 @@
 struct _GtkIconHelperPrivate {
   GtkImageDefinition *def;
 
+  GtkWidget *owner;
   GdkWindow *window;
 
   GtkIconSize icon_size;
@@ -804,9 +805,17 @@ _gtk_icon_helper_get_icon_name (GtkIconHelper *self)
 }
 
 GtkIconHelper *
-_gtk_icon_helper_new (void)
+_gtk_icon_helper_new (GtkWidget *owner)
 {
-  return g_object_new (GTK_TYPE_ICON_HELPER, NULL);
+  GtkIconHelper *helper;
+  
+  g_return_val_if_fail (GTK_IS_WIDGET (owner), NULL);
+
+  helper = g_object_new (GTK_TYPE_ICON_HELPER, NULL);
+
+  helper->priv->owner = owner;
+
+  return helper;
 }
 
 void
index 03688078944af07bbe581dec76ca059288e59c4d..a7bbcaec6dade155d0c9cad5676aca09954ef01e 100644 (file)
@@ -67,7 +67,7 @@ struct _GtkIconHelperClass
 
 GType _gtk_icon_helper_get_type (void) G_GNUC_CONST;
 
-GtkIconHelper *_gtk_icon_helper_new (void);
+GtkIconHelper *_gtk_icon_helper_new (GtkWidget *owner);
 
 void _gtk_icon_helper_clear (GtkIconHelper *self);
 void _gtk_icon_helper_invalidate (GtkIconHelper *self);
index 7a2f33fcfe61350eaa1d366f4e06229e5a757744..a24d0dfcc2a131333c10e4ed7f36d2fbf052abce 100644 (file)
@@ -402,7 +402,7 @@ gtk_image_init (GtkImage *image)
   priv = image->priv;
 
   gtk_widget_set_has_window (GTK_WIDGET (image), FALSE);
-  priv->icon_helper = _gtk_icon_helper_new ();
+  priv->icon_helper = _gtk_icon_helper_new (GTK_WIDGET (image));
   _gtk_icon_helper_set_icon_size (priv->icon_helper, DEFAULT_ICON_SIZE);
 }
 
index 629e28e6f26c083ea8ffb2e4ee7b3c9a14b89de5..0bf12c6bb5fc587a9a4bd083b86a2cb93246d7d3 100644 (file)
@@ -1099,7 +1099,7 @@ gtk_spin_button_panel_draw (GtkSpinButton   *spin_button,
   height = gdk_window_get_height (panel);
   width = gdk_window_get_width (panel);
 
-  icon_helper = _gtk_icon_helper_new ();
+  icon_helper = _gtk_icon_helper_new (widget);
   _gtk_icon_helper_set_window (icon_helper, panel);
   _gtk_icon_helper_set_use_fallback (icon_helper, TRUE);